home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-01
/
alangsbs.zip
/
VIDCHECK.SRC
< prev
next >
Wrap
Text File
|
1989-12-12
|
5KB
|
82 lines
;---------------------------------------------------------------
; VidCheck -- Identifies display board & display parameters
; Last update 3/16/89
;
; 1 entry point:
;
; VidCheck:
; Caller need pass no parameters.
; VidCheck identifies the installed display board by
; calling DispID. It then calculates numerous display
; information values, which it then stores in the block
; of display information variables in the data segment.
;---------------------------------------------------------------
VidCheck PROC
; First task is to figure out which board is on the bus:
call DispID ; Ask BIOS for adapter code; returns in AL
mov DispType,AL ; Store display adapter code in DispType
; Next we determine the font size currently in force:
cmp AL,0AH ; See if board is an MCGA
jl TryOld ; If less than code 0AH, it's not an MCGA
mov FontSize,16 ; MCGA supports *only* 16 pixel text font
jmp GetName ; Jump ahead to look up adapter name string
TryOld: cmp DispType,1 ; Is the display adapter code 1, for MDA?
jne TryCGA ; If not, go test for CGA code 2
mov FontSize,14 ; MDA uses *only* 14-pixel text font
jmp GetName ; Jump ahead to look up adapter name string
TryCGA: cmp DispType,2 ; Is the display adapter code 2, for CGA?
jne TryVGA ; If not, go test for EGA/VGA font size
mov FontSize,8 ; CGA uses *only* 8-pixel text font
jmp GetName ; Jump ahead to look up adapter name string
TryVGA: mov AH,11H ; Select VIDEO Get Font Information subservice
mov AL,30H ; requires AH = 11H and AL = 30H
mov BH,0 ; 0 = Get info about current font
int 10H ; Call VIDEO
mov FontSize,CL ; Font size in pixels is returned in CL
; Next we get the name string for the board from the info table:
GetName: mov AL,DispType ; Load display adapter code into AL
xor AH,AH ; Zero AH so we don't copy trash into DI
mov DI,AX ; Copy AX (with code in AL) into DI
mov CL,5 ; We must shift the code 5 bits to mult. by 32
shl DI,CL ; Multiply code by 32 to act as table index
lea BX,VidInfoTbl ; Load address of info. table into BX
mov BordName,BX ; Save pointer to video info. table in BordName
add Bordname,DI ; Add offset into table to right element
; Next we get the refresh buffer segment from the table:
mov AX,[BX+DI+27] ; Index into table past name string to segment
mov VidSegment,AX ; Store segment from table to VidSegment variable
; Here we calculate the number of lines on-screen from font size:
xor AH,AH ; Make sure AH has no trash in it
mov AL,FontSize ; Load the font size in pixels into AL
cmp AL,8 ; Is it the 8-pixel font?
jne Try14 ; If not, try the 14-pixel font
mov AL,1 ; The 8-pixel font is table offset 1
jmp ReadLns ; Jump ahead to read screen lines from table
Try14: cmp AL,14 ; Is it the 14-pixel font?
jne Do16 ; If not, it has to be the 16-pixel font
mov AL,2 ; The 14-pixel font is table offset 2
jmp ReadLns ; Jump ahead to read screen lines from table
Do16: mov AL,3 ; The 16-pixel font is table offset 3
ReadLns: add DI,AX ; Add font size offset to table element offset
mov AL,[BX+DI+28] ; Load the screen lines value from the table
mov VisibleY,AL ; and store it in the VisibleY variable
mov AH,VisibleX ; Load the screen columns value to AH
xchg AH,AL ; Exchange AH & AL for 0-basing
dec AL ; Subtract one from column count for 0-basing
dec AH ; Subtract one from line count for zero-basing
mov LRXY,AX ; And store 0-based X,Y word into LRXY variable
; Finally, we calculate the size of the refresh buffer in bytes:
mov AL,VisibleY ; We multiply screen lines time screen columns
mul VisibleX ; times 2 (for attributes) to get buffer size
shl AX,1 ; Multiply lines * columns by 2
mov VidBufSize,AX ; Store refresh buffer size in VidBufSize
ret ; Return to caller
VidCheck ENDP